"""
jieba 分词 三种模式:
    精确模式：试图将句子最精确地切开，适合文本分析
    全模式：把句子中可以成词的都扫描出来，速度非常快，但是不能理解歧义
    搜索引擎模式：在精确模式基础上，对长词再次进行切分，提高召回率，适合搜索引擎分词

支持繁体
支持自定义字典

算法：
    基于前缀词典实现高效词图扫描，生成句子中的汉字所有可能成词情况所构成的有向无环图
    采用动态规划，查找最大概率路径，找出基于词频的最大切分组合
    对于未登录词，采用基于汉字成词能力的HMM模型，使用veterbi算法

"""

import jieba
import re
import jieba.analyse

import jieba.posseg as pseg

# 加载自定义词典
# jieba.load_userdict('user_dict.txt')
# seg_list = jieba.cut("在泰山路小区巡视时，发现居民有违规充电的现象，存在安全隐患")

# 加载停用词表
# filePath = r"stop_word.txt"
# stopWords = [line.strip() for line in open(filePath, 'r', encoding='utf-8').readlines()]

# 去除停用词表内的词
# seg_list = [i for i in seg_list if i not in stopWords and i != " "]
# print(stopWords)
#
# print("/ ".join(seg_list))


"""
@:param word :需要分词的句子
@:param user_dict : 自定义词典：default = user_dict.txt
@:param stop_words : 停用词表 路径，：如 r"stop_word.txt" ;default = r"stop_word.txt"
"""

# 词性
# 名词、地名、机构团体、英文、动词、形容词
my_flags = ('n', 'ns', 'nt', 'eng', 'v', 'a', 'ad', 't')

# 空白字符
pattern0 = r'\s+'
# 来话人反映230519T02822相同问题
pattern1 = r'来话人反映\d{6}T\d{5}相同问题'
# （小区治理）（不需要部门联系）
pattern2 = r'（小区治理）|（不需要部门联系）|（企业问题）|（匿名.*?）|（小区治理，.*?）'
# 已派警前往处置，请12345协调相关政府职能部门共同开展工作。
pattern3 = r'【已派警前往处置，.*?】'
# 标点符号
pattern4 = r'[.,!?;:(){}\[\]\'"<>]'

combined_pattern = f'({pattern0})|({pattern1})|({pattern2})|({pattern3})|({pattern4})'


def cut(word: str, user_dict="user_dict.txt", stop_words=r"stop_word.txt"):
    jieba.load_userdict(user_dict)
    # temp_seg_list = pseg.cut(re.sub(combined_pattern, '', word))
    temp_seg_list = jieba.cut(re.sub(combined_pattern, '', word))
    userstopwords = [line.strip() for line in open(stop_words, 'r', encoding='utf-8').readlines()]
    # 去除停用词表内的词
    # [w.word for w in jp.cut(txt) if w.flag in flags and w.word not in stopwords]
    # result_seg_list = [i.word for i in temp_seg_list if i.flag in my_flags and i not in userstopwords and i != " "]
    result_seg_list = [i for i in temp_seg_list if i not in userstopwords and i != " "]

    return result_seg_list


str = '''
太禾房地产公司近期在太禾水晶城售卖车位，未告知车位产权实际情况，
即不能办产权证，虚假宣传。虚假销售，虚假车牌，如卖28个实际可能只有几个。
将外来车辆送进小区违规占车位。涨租金，将原来固定车位变成不固定等下作恶心手段，
逼迫业主购买没有产权证的车位，且价格高。以前其实业主停车好好的，各种秩序好了很多很多，
现在它来搞乱添堵。 扰乱社区治安，加重群众矛盾。采用诈骗虚假手段望逼迫业主购买车位。违法消费者法，物价法。 
2、开发商未经业主大会协商和同意，擅自随意涨了租金，且在近期又想涨价。
根据民法典，消费者法，开发商有定价权力，但不能乱涨价，且不经过业主大会协商，业主被迫，涉嫌垄断，
按现在来说根本不是市场定价，业主能不停车？且车位完整产权不属于开发商，买了车位的不能办产权，
收益归投资者但更不能让开发商压榨民脂民膏。 
3，开发商违法民法典，把车位堵上，把外面的车开进来停空位，
让业主停车困难停不了车。违背了民法典规定小区车位应优先满足业主使用。 
4，开发商种种低劣违法行为，给社会造成极大危害，埋下治安问题。
 5，诉求：开发商将不固定车位恢复固定，停止扰乱社区稳定的行为，以满足业主停车需求为重点企业工作，
 这也是社区治理，人民幸福的民生大事。收钱屁事不干干的都是恶心人的事。 不能随意涨车位租金，
 需经过业委会及街道社区协商及同意，必须优先保证业主停车需求，如想涨价租但业主不同意就不让停了，
 政府尽快出台文件约束开发商。 如果以后还卖车位，需在现场和业主问起时如实告知产权情况，
 现场张贴产权情况告示，停止诈骗虚假行为，合法合格经营。 图一开发商安的庄庄，遮挡业主停止，企图减少车位，加大停车困难。 
 图二是单方面贴的通知，没有任何市场标准和调研，技术水平，就是为了逼迫卖车位。 不用电话回访，'在此公布即可，谢谢。。。'''

str2 = "大件路白家段280号7栋附158号，附159号，附148"

print(jieba.lcut(re.sub(combined_pattern, '', str2)))
cut_word_with_flag = pseg.cut(re.sub(combined_pattern, '', str2))
print(cut(re.sub(combined_pattern, '', str2)))
for item in cut_word_with_flag:
    print(item.word, item.flag)

print("关键词"+" / ".join(jieba.analyse.extract_tags(str)))
print("关键词"+" / ".join(jieba.analyse.extract_tags(str2)))

# 定义正则表达式，匹配“附”后面跟随的数字
pattern_house_num = re.compile(r'附\d+(?:号)?')


# 自定义分词函数
def custom_tokenize(text):
    # 先用正则表达式找到所有“附”后面跟随的数字
    matches = pattern_house_num.findall(text)

    # 将匹配到的部分替换为占位符
    for match in matches:
        text = text.replace(match, '')

    # 使用 jieba 进行分词
    result = list(jieba.cut(text))

    # 去除多余的空格
    result = [word for word in result if word.strip()]

    result += matches
    return result


# 输出结果
print(custom_tokenize(str2))
